\section{Création de la base de données}
\subsection{Scripts de création}
Les scripts de création et de destruction de la base de donnée et des tables sont dans le fichier \texttt{src/src\_sql/base.sql}.
Les commandes pour créer la base et les tables sont les suivantes:
\begin{lstlisting}
-- creer la base de donnee
CREATE DATABASE club_basket; 

-- creer une table
CREATE TABLE CLUB
(
    ID_CLUB         CHAR(30)                             NOT NULL,
    CONSTRAINT pk_club PRIMARY KEY (ID_CLUB)			 
); 
\end{lstlisting}

Le mot clé \texttt{NOT NULL} contraint l'attribut à avoir une valeur lors d'une insertion dans la table. On l'utilise systématiquement dans les cas similaire où l'attribut est une clé primaire: \texttt{CONSTRAINT pk\_club PRIMARY KEY (ID\_CLUB)}

Il est important de noter que l'ordre de création des tables n'a pas d'importance tant que l'on n'affecte pas les clés étrangères.
Elles sont affectées dans l'ordre des dépendances dictées par le schémas relationnel. La commande est la suivante:

\begin{lstlisting}
alter table BUREAU
      ADD CONSTRAINT fk1_bureau FOREIGN KEY (ID_LICENCIE)
      REFERENCES LICENCIE (ID_LICENCIE) ON DELETE CASCADE;
\end{lstlisting}

Les mots clés \texttt{ON DELETE CASCADE} seront utile lors de la suppression, il permetteront de supprimer automatiquement les dépendances.

\subsection{Scripts de suppression}
On supprime la base avec la commande suivante:
\begin{lstlisting}
DROP DATABASE IF EXISTS  club_basket; 
\end{lstlisting}
\texttt{IF EXISTS} permet d'eviter un warning si on essaye de supprimer une table qui n'existe pas.

On supprime les tables avec la commande suivante:
\begin{lstlisting}
DROP TABLE IF EXISTS CLUB ;
\end{lstlisting}

La suppression d'une entrée s'effectue avec la commande suivante:
\begin{lstlisting}
DELETE FROM CATEGORIE WHERE ID_CATEGORIE = Categorie;
\end{lstlisting}
Comme il est dit précédemment, les dépendances de suppression definies lors de l'attribution des clés étrangères permet de supprimer automatiquement les dépendances.

\textbf{NOTE:}La suppression et la recréation de la base et des tables se fait automatiquement grâce à la commmande SQL : \texttt{SOURCE base.sql} depuis le dossier \texttt{src/src\_sql/}.

\subsection{Scripts d'insertion}
Lorsqu'on insère des donnée dans une table, il faut s'assurer que les attributs qui sont précédés de \texttt{NOT NULL} sont initialisés, et que les clés privés sont uniques. Dans certains cas les attributs de clés privés sont précédés de \texttt{AUTO\_INCREMENT}, dans ce cas il n'est pas nécéssaire de renseigner le champ de clé primaire, le logiciel de SGBD le fait pour nous.

Exemple d'insertion de donnée:
\begin{lstlisting}
INSERT INTO PARTICIPATION (ID_JOUEUR,ID_RENCONTRE,A_PARTICIPE) VALUES (10,1,TRUE);
\end{lstlisting}

\section{Requêtes SQL}
L'intérêt d'une base de données est de pouvoir la consulter. Pour cela nous avons à notre disposition une panoplie sde commandes SQL permettant de selectionner, joindre, grouper, trier, compter\dots

\subsection{Consultation}
Exemple de requetes de consultation:
\begin{lstlisting}
-- matchs joues
SELECT NOM_CHAMPIONNAT, CHAMPIONNAT.ID_CATEGORIE, 
       R.ID_CLUB ADVERSAIRE , R.NUMERO
FROM RENCONTRE INNER JOIN CHAMPIONNAT USING(ID_CHAMPIONNAT)
	       INNER JOIN JOUEUR      ON (ID_JOUEUR = 5) 
     	       INNER JOIN EQUIPE R    ON((R.ID_EQUIPE = ID_EQUIPE_RECEVANT
                                      OR  R.ID_EQUIPE = ID_EQUIPE_VISITEUR)
                                      AND R.ID_EQUIPE != JOUEUR.ID_EQUIPE);
\end{lstlisting}

Le but est d'obtenir les informations intéressantes concernant les rencontres qu'a éffectué un joueur.

Première ligne:
\texttt{SELECT NOM\_INDIVIDU, PRENOM\_INDIVIDU, NOM\_CHAMPIONNAT, CHAMPIONNAT.ID\_CATEGORIE, R.ID\_CLUB ADVERSAIRE, R.NUMERO}

On choisit de faire apparaître sur chaque ligne de la table résultat, le championnat dans lequel s'est déroulé la rencontre, la catégorie de la rencontre (cadet, séniors \dots), le club des adversaires et le numero de l'équipe (équipe cadet 1, cadet 2, \dots).

\texttt{FROM}

On choisit de quel(s) table(s) on tire ces informations; On les tires de la jointure interne des tables \texttt{RENCONTRE,CHAMPIONNAT,JOUEUR,EQUIPE} en faisant attention de selectionner un joueur: \texttt{ON (ID\_JOUEUR = 5)} et d'afficher l'équipe qui n'est pas celle du joueur: \texttt{ON((R.ID\_EQUIPE = ID\_EQUIPE\_RECEVANT OR  R.ID\_EQUIPE = ID\_EQUIPE\_VISITEUR) AND R.ID\_EQUIPE != JOUEUR.ID\_EQUIPE)}.

\subsection{Statistiques}
Requête principale: Le classement des équipes d'un championat.
On procède en trois étapes: 
\begin{itemize}
\item Liste des équipes et de leur nombre de victoires et de défaites:
\begin{lstlisting}
SELECT DISTINCT ID_EQUIPE, 
       COUNT(CASE WHEN (ID_EQUIPE_VISITEUR = ID_EQUIPE AND SCORE_RECEVANT>SCORE_VISITEUR
                       OR ID_EQUIPE_RECEVANT = ID_EQUIPE AND SCORE_RECEVANT<SCORE_VISITEUR)
                       THEN 1 ELSE 0 END) AS VICTOIRES,
       COUNT(CASE WHEN (ID_EQUIPE_VISITEUR = ID_EQUIPE AND SCORE_RECEVANT<SCORE_VISITEUR
                    OR ID_EQUIPE_RECEVANT = ID_EQUIPE AND SCORE_RECEVANT>SCORE_VISITEUR)
                       THEN 1 ELSE 0 END) AS DEFAITES
FROM
(SELECT ID_RENCONTRE,
        ID_EQUIPE_RECEVANT, 
        ID_EQUIPE_VISITEUR,
         SUM(CASE WHEN ID_EQUIPE = ID_EQUIPE_RECEVANT THEN POINTS ELSE 0 END) AS SCORE_RECEVANT,
        SUM(CASE WHEN ID_EQUIPE = ID_EQUIPE_VISITEUR THEN POINTS ELSE 0 END) AS SCORE_VISITEUR
FROM    JOUEUR INNER JOIN PARTICIPATION USING(ID_JOUEUR)
       	       INNER JOIN RENCONTRE USING(ID_RENCONTRE)
WHERE ID_CHAMPIONNAT = 1
GROUP BY ID_RENCONTRE)T1
INNER JOIN EQUIPE ON(ID_EQUIPE = ID_EQUIPE_RECEVANT OR ID_EQUIPE = ID_EQUIPE_VISITEUR)
GROUP BY ID_RENCONTRE,ID_EQUIPE
ORDER BY VICTOIRES DESC, DEFAITES ASC;
\end{lstlisting}

On commence par récupérer le résultat d'une rencontre:
\texttt{ID\_RENCONTRE, ID\_EQUIPE\_RECEVANT, SCORE\_RECEVANT, ID\_EQUIPE\_VISITEUR, SCORE\_VISITEUR}
Les champs d'identifiants sont contenus dans la table \texttt{RENCONTRE}
On la joint avec la table \texttt{PARTICIPATION} pour récupérer les points et on somme les points des joueurs de chaque equipe.

Pour chaque equipe du championnat: \texttt{INNER JOIN EQUIPE} on on regarde si elle a recu et si le recevant à gagné, de même dans le cas visiteur, et on décompte ainsi le nombre de victoires et de defaites. Enfin on supprime les doublons dues au \texttt{INNER JOIN EQUIPE}.
pour chaque rencontre dans un championnat.

\item Liste des équipes et de leur score cumulé:
\begin{lstlisting}
  SELECT ID_EQUIPE, SUM(POINTS) AS SCORE
FROM JOUEUR INNER JOIN PARTICIPATION USING(ID_JOUEUR)
     	    INNER JOIN RENCONTRE USING(ID_RENCONTRE)
WHERE ID_CHAMPIONNAT=5
GROUP BY ID_EQUIPE;
\end{lstlisting}
\item jointure des trois tables précédentes et classement selon les trois critères
\end{itemize}


\subsection{Mises à jour}
Il est possible de mettre à jour certaines données, mais il faut respecter les contraintes sur les clés vues dans la section insertion.

Exemple de mise à jour de données:
\begin{lstlisting}
UPDATE RENCONTRE SET ID_EQUIPE_RECEVANT = 2 WHERE ID_RENCONTRE = 1;
\end{lstlisting}

\textbf{Note}: Toute les requêtes de consultation et statistiques sont disponibles dans le fichier \texttt{src/src\_sql/requetes.sql}; Les requêtes de mises à jour sont disponibles dans le fichier \texttt{src/src\_sql/mises\_a\_jour.sql}
